#! python3
# 用 selenium 模块控制浏览器

import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

"""
selenium要求
    1、需要下载对应浏览器驱动程序，放在python.exe同级目录，或通过下方注释的方法指定程序位置
          firefox浏览器驱动程序为：geckodriver.exe
          ie浏览器驱动程序为：IEDriverServer.exe
    2、浏览器的本地Intranet、受信任的站点、受限制的站点这3个的启用保护模式设置必须一致,全选或全不选
"""


def getBrowser(url):
    """
    获取浏览器对象并打开浏览器
    :param url:
    :return:
    """

    # browser = webdriver.Firefox()
    # print(type(browser))
    # browser.get('http://www.baidu.com')

    # ieDriver = 'C:/Program Files/Internet Explorer/IEDriverServer.exe'
    # os.environ["webdriver.ie.driver"] = ieDriver
    # browser = webdriver.Ie(ieDriver)
    browser = webdriver.Ie()
    # print(type(browser))
    browser.get(url)

    element = browser.switch_to.active_element  # 返回的是当前焦点的对象，即返回WebElement对象
    print(element)

    return browser


def findElementDemoAndClick(browser):
    """
    在页面中寻找元素
    find_element_*方法返回一个 WebElement 对象，代表页面中匹配查询的第一个元素。
    find_elements_*方法返回 WebElement_*对象的列表，包含页面中所有匹配的元素
    """
    # browser.find_element_by_class_name('name')
    # browser.find_elements_by_class_name('name')  # 使用 CSS 类 name 的元素
    # browser.find_element_by_css_selector('selector')
    # browser.find_elements_by_css_selector('selector')  # 匹配 CSS selector 的元素
    # browser.find_element_by_id('s_lg_img')
    # browser.find_elements_by_id('s_lg_img')  # 匹配 id 属性值的元素
    # browser.find_element_by_link_text('text')
    # browser.find_elements_by_link_text('text')   # 完全匹配提供的 text 的<a>元素
    # browser.find_element_by_partial_link_text('text')
    # browser.find_elements_by_partial_link_text('text')   # 包含提供的 text 的<a>元素
    # browser.find_element_by_name('name')
    # browser.find_elements_by_name('name')   # 匹配 name 属性值的元素
    # browser.find_element_by_tag_name('name')
    # browser.find_elements_by_tag_name('name')  # 匹配标签 name 的元素(大小写无关，<a>元素匹配'a'和'A')

    # element = browser.find_element_by_class_name('title-content-title')
    elements = browser.find_elements_by_class_name('title-content-title')  # 使用 CSS 类 name 的元素
    print(len(elements))

    """
    WebElement 的属性和方法
    """
    for i in range(1):
        element = elements[i]
        print('=============================================================')
        print('tag_name:', element.tag_name)  # 标签名，例如 'a'表示<a>元素
        print('get_attribute(\'class\'):', element.get_attribute('class'))  # 该元素指定属性的值
        print('text:', element.text)  # 该元素内的文本，例如<span>hello</span>中的'hello'
        # print(element.clear())  # 对于文本字段或文本区域元素，清除其中输入的文本
        print('is_displayed:', element.is_displayed())  # 如果该元素可见，返回 True，否则返回 False
        print('is_enabled:', element.is_enabled())  # 对于输入元素，如果该元素启用，返回 True，否则返回 False
        # print(element.is_selected())  # 对于复选框或单选框元素，如果该元素被选中，选择 True，否则返回 False
        print('location:', element.location)  # 一个字典，包含键'x'和'y'，表示该元素在页面上的位置

        """
        点击页面 
        find_element_*和 find_elements_*方法返回的 WebElement 对象有一个 click()方法，
        模拟鼠标在该元素上点击。这个方法可以用于链接跳转，选择单选按钮，点击提交按钮，
        或者触发该元素被鼠标点击时发生的任何事情。
        """
        element.click()


def sendTextsAndSubmit(browser, msg):
    """
    填写并提交表单
    向 Web 页面的文本字段发送击键，只要找到那个文本字段的<input>或<textarea>元
    素，然后调用 send_keys()方法
    """
    element = browser.find_element_by_id('kw')
    element.send_keys(msg)
    element.submit()


def sendKeys(browser, myKey):
    """
    发送特殊键
    from selenium.webdriver. common.keys import Keys
    :return:

    selenium.webdriver.common.keys 模块中常用的变量:
    Keys.DOWN, Keys.UP, Keys.LEFT, Keys.RIGHT
    Keys.ENTER, Keys.RETURN
    Keys.HOME, Keys.END, Keys.PAGE_DOWN, Keys.PAGE_UP
    Keys.ESCAPE, Keys.BACK_SPACE, Keys.DELETE
    Keys.F1, Keys.F2, ..., Keys.F12
    Keys.TAB
    """
    # 调用 browser.find_element_by_tag_name('html')是像一般 Web 页面发送按键的好地方
    htmlElem = browser.find_element_by_tag_name('html')
    htmlElem.send_keys(myKey)  # scrolls to top


def clickBrowseBtn(browser, action):
    """
    点击浏览器按钮
    browser.back()点击“返回”按钮。
    browser.forward()点击“前进”按钮。
    browser.refresh()点击“刷新”按钮。
    browser.quit()点击“关闭窗口”按钮
    :param browser:
    :return:
    """
    if action == 'back':
        browser.back()
    elif action == 'forward':
        browser.forward()
    elif action == 'refresh':
        browser.refresh()
    elif action == 'quit' or action == 'bye':
        browser.quit()
    else:
        print('错误的参数')


if __name__ == '__main__':
    browser = getBrowser("http://www.baidu.com")

    # findElementDemoAndClick(browser)
    sendTextsAndSubmit(browser, 'python爬虫')
    sendKeys(browser, Keys.PAGE_DOWN)
    clickBrowseBtn(browser, 'bye')

